10070. Високосный год или …
Год является високосным, если он
делится на 4, но не делится на 100 за исключением того, что все года, делящиеся
на 400, являются високосными. В племени Гуламату проходит два типа фестивалей:
1. фестиваль гулукулу, проходящий
в год, делящийся на 15;
2. фестиваль булукулу, проходящий
в високосный год, делящийся на 55.
По
заданному году следует установить его тип и указать тип проводимого фестиваля.
Последовательность вывода информации о годе следующая: високосный ® гулукулу ® булукулу. Год не является
обычным, если в нем проводится фестиваль.
Вход.
Каждая строка содержит год, не меньший 2000. Каждый год содержит не более 10000
символов.
Выход. Для каждого года вывести информацию
о нем. Выходные данные для каждого теста разделять пустой строкой.
2000
3600
4515
2001
Пример выхода
This is leap
year.
This is leap
year.
This is
huluculu festival year.
This is
huluculu festival year.
This is an
ordinary year.
математика, делимость
В задаче следует написать
функции, проверяющие делимость длинного числа на некоторые числа. Для проверки
високосности года требуется проверка делимости на 4, 100 и 400. Проводить ли в
данном году фестиваль или нет, следует проверить делимость года на 3 и 5
(деление на 15) и на 5 и 11 (деление на 55). Проверка на делимость совершается
следующим образом:
На 4: число, составленное из
последних двух цифр, должно делиться на 4;
На 100: число должно оканчиваться
двумя нулями;
На 400: число, составленное из
последних четырех цифр, должно делиться на 400;
На 3: сумма цифр числа должна
делиться на 3;
На 5: число должно оканчиваться
на 0 или на 5;
На 11: разность суммы цифр,
стоящих на нечетных местах и суммы цифр, стоящих на четных местах, должна
делиться на 11;
Если год удовлетворяет
каким-нибудь условиям, то вывести об этом информацию согласно формату вывода.
Если проводится фестиваль гулукулу, но год является обычным, то фразу “This is
an ordinary year.” не выводим, устанавливая ordinary
= 0.
В символьный массив n будем
считывать текущий год. В переменную leap
(ordinary) занесем 1, если текущий
год будет високосным (обычным). В переменной len храним длину строки n.
char n[10000];
int leap,ordinary,len;
Следующие функции проверяют,
делится ли длинное число, записанное в массиве n, на соответствующее значение.
int divisible4(void)
{
int a = n[len-2]*10+n[len-1];
return a % 4 == 0;
}
int divisible100(void)
{
int a = (n[len-2]-'0')*10+(n[len-1]-'0');
return a == 0;
}
int divisible400(void)
{
int a = (n[len-4]-'0')*1000 + (n[len-3]-'0')*100 +
(n[len-2]-'0')*10 + n[len-1]-'0';
return a % 400 == 0;
}
int divisible5(void)
{
return (n[len-1] == '0') || (n[len-1] == '5');
}
int divisible3(void)
{
int sum,i;
for(sum=i=0;i<len;i++)
sum += (n[i] - '0');
return sum % 3 == 0;
}
int divisible11(void)
{
int a,b,i;
for(a=b=i=0;i<len;i+=2) a += (n[i] - '0');
for(i=1;i<len;i+=2) b += (n[i] - '0');
return (a - b) % 11 == 0;
}
Основной цикл программы. Читаем
год в массив n. Организуем чтение данных в цикле while таким образом, чтобы
пустая строка не выводилась после вывода результата на последний тест (иначе
будет Presentation Error). Проверяем, является ли год високосным и проводятся
ли в нем фестивали согласно условию задачи.
scanf("%s",n);
while(1)
{
leap = 0; ordinary = 1;
len = strlen(n);
if (divisible4() && !(divisible100() &&
!divisible400()))
{
printf("This is leap year.\n");
leap = 1;ordinary = 0;
}
if (divisible3() && divisible5())
{
printf("This is huluculu festival year.\n");
ordinary = 0;
}
if (leap && divisible11() && divisible5())
printf("This is bulukulu festival year.\n");
if (ordinary) printf("This is an ordinary year.\n");
if(scanf("%s",n) != 1) break;
printf("\n");
}
}